package com.easefun.polyv.cloudclassdemo.watch.linkMic.widget;

import android.content.Context;
import android.content.res.TypedArray;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.RectF;
import android.util.AttributeSet;
import android.view.View;
import android.view.animation.Animation;
import android.view.animation.Transformation;
import android.widget.TextView;

import com.easefun.polyv.cloudclassdemo.R;
import com.easefun.polyv.foundationsdk.log.PolyvCommonLog;
import com.easefun.polyv.foundationsdk.utils.PolyvScreenUtils;

/**
 * @author df
 * @create 2018/11/30
 * @Describe
 */
public class PolyvSmoothRoundProgressView extends View {
    private static final String TAG = "PolyvSmoothRoundProgres";
    private Paint bgPaint;//绘制背景圆弧的画笔
    private Paint progressPaint;//绘制圆弧的画笔

    private RectF circleRectF;//绘制圆弧的矩形区域

    private CircleBarAnim startAnim;

    private float progressNum;//可以更新的进度条数值
    private float maxNum;//进度条最大值

    private int progressColor;//进度条圆弧颜色
    private int bgColor;//背景圆弧颜色
    private float startAngle;//背景圆弧的起始角度
    private float cacheAngle;//背景圆弧的中间角度
    private float sweepAngle;//背景圆弧扫过的角度
    private float barWidth;//圆弧进度条宽度

    private int defaultSize;//自定义View默认的宽高
    private float progressSweepAngle;//进度条圆弧扫过的角度

    private TextView textView;
    private OnAnimationListener onAnimationListener;


    public PolyvSmoothRoundProgressView(Context context, AttributeSet attrs) {
        super(context, attrs);
        init(context, attrs);
    }

    private void init(Context context, AttributeSet attrs) {
        TypedArray typedArray = context.obtainStyledAttributes(attrs, R.styleable.CircleBarView);

        progressColor = typedArray.getColor(R.styleable.CircleBarView_progress_color, getResources().getColor(R.color.video_back));
        bgColor = typedArray.getColor(R.styleable.CircleBarView_bg_color, Color.GRAY);
        startAngle = typedArray.getFloat(R.styleable.CircleBarView_start_angle, 0);
        sweepAngle = typedArray.getFloat(R.styleable.CircleBarView_sweep_angle, 360);
        barWidth = typedArray.getDimension(R.styleable.CircleBarView_bar_width, PolyvScreenUtils.dip2px(context, 10));
        typedArray.recycle();

        progressNum = 0;
        maxNum = 1000;
        defaultSize = PolyvScreenUtils.dip2px(context, 100);
        circleRectF = new RectF();

        progressPaint = new Paint();
        progressPaint.setStyle(Paint.Style.STROKE);//只描边，不填充
        progressPaint.setColor(progressColor);
        progressPaint.setAntiAlias(true);//设置抗锯齿
        progressPaint.setStrokeWidth(barWidth);
        progressPaint.setStrokeCap(Paint.Cap.ROUND);//设置画笔为圆角

        bgPaint = new Paint();
        bgPaint.setStyle(Paint.Style.STROKE);//只描边，不填充
        bgPaint.setColor(bgColor);
        bgPaint.setAntiAlias(true);//设置抗锯齿
        bgPaint.setStrokeWidth(barWidth);
        bgPaint.setStrokeCap(Paint.Cap.ROUND);

        startAnim = new CircleBarAnim();
    }

    @Override
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
        super.onMeasure(widthMeasureSpec, heightMeasureSpec);

        int height = measureSize(defaultSize, heightMeasureSpec);
        int width = measureSize(defaultSize, widthMeasureSpec);
        int min = Math.min(width, height);// 获取View最短边的长度
        setMeasuredDimension(min, min);// 强制改View为以最短边为长度的正方形

        if (min >= barWidth * 2) {
            circleRectF.set(barWidth / 2, barWidth / 2, min - barWidth / 2, min - barWidth / 2);
        }

    }

    @Override
    protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);
        canvas.drawArc(circleRectF, startAngle, sweepAngle, false, bgPaint);
        if (progressSweepAngle <= 0) {
            progressSweepAngle = 0;
        }
        if (progressSweepAngle >= 0) {
            canvas.drawArc(circleRectF, startAngle, progressSweepAngle, false, progressPaint);
        }
    }


    public class CircleBarAnim extends Animation {

        public CircleBarAnim() {
        }

        @Override
        protected void applyTransformation(float interpolatedTime, Transformation t) {//interpolatedTime从0渐变成1,到1时结束动画,持续时间由setDuration（time）方法设置
            super.applyTransformation(interpolatedTime, t);

            if (progressNum > maxNum) {
                progressNum = maxNum;
            }
            float progressAngle = sweepAngle * progressNum / maxNum;
            //前半部分是增加声音，后半部分是减音量
            if(interpolatedTime <= 0.5){
                if (cacheAngle > 0) {
                    if (cacheAngle > progressAngle) {//回调
                        if(interpolatedTime <= 0.5){
                            progressSweepAngle = (1-interpolatedTime )* 2 * (cacheAngle - progressAngle) + progressAngle;
                            if (progressSweepAngle > sweepAngle) {
                                progressSweepAngle = sweepAngle;
                            }
                        }
                    } else {//前进
                        progressSweepAngle = cacheAngle + interpolatedTime * 2 * (progressAngle - cacheAngle);
                    }

                }else{
                    progressSweepAngle = interpolatedTime * 2 * progressAngle;
                }

            }else{
                progressSweepAngle = (1-interpolatedTime) * 2 * progressAngle;
            }



            if (onAnimationListener != null) {
                if (textView != null) {
                    textView.setText(onAnimationListener.howToChangeText(interpolatedTime, progressNum, maxNum));
                }
                onAnimationListener.howToChangeProgressColor(progressPaint, interpolatedTime, progressNum, maxNum);
            }

            if (Math.abs(interpolatedTime - 1) < 0.01) {
                cacheAngle = progressSweepAngle = 0;
                PolyvCommonLog.e(TAG, "start end animation");
//                animEnd.setDuration(500);
//                startAnimation(animEnd);
            }
            postInvalidate();
        }
    }

    private int measureSize(int defaultSize, int measureSpec) {
        int result = defaultSize;
        int specMode = View.MeasureSpec.getMode(measureSpec);
        int specSize = View.MeasureSpec.getSize(measureSpec);

        if (specMode == View.MeasureSpec.EXACTLY) {
            result = specSize;
        } else if (specMode == View.MeasureSpec.AT_MOST) {
            result = Math.min(result, specSize);
        }
        return result;
    }


    /**
     * 设置进度条最大值
     *
     * @param maxNum
     */
    public void setMaxNum(float maxNum) {
        this.maxNum = maxNum;
    }

    /**
     * 设置进度条数值
     *
     * @param progressNum 进度条数值
     * @param time        动画持续时间
     */
    public void setProgressNum(float progressNum, int time) {
        this.progressNum = progressNum;
        if (!startAnim.hasEnded()) {
            cacheAngle = progressSweepAngle;
            startAnim.cancel();
        }
        startAnim.setDuration(time);
        this.startAnimation(startAnim);

    }

    /**
     * 设置显示文字的TextView
     *
     * @param textView
     */
    public void setTextView(TextView textView) {
        this.textView = textView;
    }

    public interface OnAnimationListener {

        /**
         * 如何处理要显示的文字内容
         *
         * @param interpolatedTime 从0渐变成1,到1时结束动画
         * @param updateNum        进度条数值
         * @param maxNum           进度条最大值
         * @return
         */
        String howToChangeText(float interpolatedTime, float updateNum, float maxNum);

        /**
         * 如何处理进度条的颜色
         *
         * @param paint            进度条画笔
         * @param interpolatedTime 从0渐变成1,到1时结束动画
         * @param updateNum        进度条数值
         * @param maxNum           进度条最大值
         */
        void howToChangeProgressColor(Paint paint, float interpolatedTime, float updateNum, float maxNum);

    }

    public void setOnAnimationListener(OnAnimationListener onAnimationListener) {
        this.onAnimationListener = onAnimationListener;
    }
}
